home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / basic / qbfaqr01.zip / TEXT3WIN.BAS < prev    next >
BASIC Source File  |  1992-08-01  |  7KB  |  278 lines

  1. ' TEXTWIN.BAS
  2.  
  3. ' This Sample program shows how to use
  4. ' TextWindow -- a function that allows
  5. ' a user to enter a window of text
  6.  
  7. DEFINT A-Z
  8. DECLARE FUNCTION TextWindow (Buffer$, Lines, Columns, x, y)
  9. DECLARE SUB MakeBox (x, y, Lines, Columns)
  10.  
  11. CLS
  12. LOCATE 15, 1: PRINT "Here are the results: "
  13.  
  14. 'declare Text Window size
  15. TextLines = 10: TextCols = 64
  16. Xwindow = 3: Ywindow = 10
  17.  
  18. 'declare buffer area to hold text
  19. Buffer$ = SPACE$(TextLines * TextCols)
  20.  
  21. ' call text window
  22. ExitOK = TextWindow(Buffer$, TextLines, TextCols, Xwindow, Ywindow)
  23. IF ExitOK THEN
  24.  PRINT Buffer$
  25. ELSE
  26.  PRINT "Window not Saved"
  27. END IF
  28.  
  29. END
  30.  
  31.  
  32.  
  33. SUB MakeBox (x, y, Lines, Columns)
  34. ' Draw a single line box beginning at X,Y
  35. ' box is Lines tall by Columns wide
  36. DEFINT A-Z
  37.  
  38. ' top row
  39. LOCATE x, y, 0
  40. PRINT CHR$(218);
  41. PRINT STRING$(Columns - 2, CHR$(196));
  42. PRINT CHR$(191)
  43.  
  44. 'bottom row
  45. LOCATE x + Lines - 1, y, 0
  46. PRINT CHR$(192);
  47. PRINT STRING$(Columns - 2, CHR$(196));
  48. PRINT CHR$(217)
  49.  
  50. 'sides
  51. FOR I = 1 TO Lines - 2
  52.    LOCATE x + I, y, 0: PRINT CHR$(179)
  53.    LOCATE x + I, y + Columns - 1, 0
  54.    PRINT CHR$(179)
  55. NEXT I
  56.  
  57. END SUB
  58.  
  59. FUNCTION TextWindow (Buffer$, Lines, Columns, Xwindow, Ywindow)
  60. ' This function allows the user to key in a window
  61. ' of text the input area will be Lines by Columns
  62. ' in size.  xwindow and ywindow are the upper left
  63. ' corner coordinates of text entry window
  64. ' The text is placed in Buffer$
  65. ' returns TRUE if user saves with Ctrl-End,
  66. ' FALSE on Esc
  67.  
  68. 'save cursor position
  69. SaveX = CSRLIN: SaveY = POS(0)
  70.  
  71. ' Scan codes for current valid user key-strokes
  72. ScanKeyhome = 71
  73. ScanKeyend = 79
  74. ScanKeyup = 72
  75. ScanKeyleft = 75
  76. ScanKeyright = 77
  77. ScanKeydown = 80
  78. ScanKeyctrlleft = 115
  79. ScanKeyctrlright = 116
  80. ScanKeyinsert = 82
  81. ScanKeydelete = 83
  82. ScanKeyctrlend = 117
  83. ScanKeyenter = 13
  84. ScanKeyescape = 27
  85. ScanKeybackspace = 8
  86.  
  87. 'Start with insert mode turned off
  88. FALSE = 0
  89. TRUE = NOT FALSE
  90. inserton = FALSE
  91.  
  92. ' Draw box around text, display marquis
  93. CALL MakeBox(Xwindow - 1, Ywindow - 1, Lines + 3, Columns + 2)
  94. LOCATE Xwindow + Lines, Ywindow + 1, 0
  95. PRINT "[Esc] to Abort,[Ctrl-End] to Save"
  96.  
  97. 'Current X,Y Coordinates of cursor within window
  98. XCoord = Xwindow: YCoord = Ywindow
  99.  
  100. 'start taking text in top left corner
  101. LOCATE XCoord, YCoord, 1
  102.  
  103. 'main user input loop
  104. DO
  105.   UserKey$ = INKEY$
  106.   SELECT CASE LEN(UserKey$)
  107.     CASE 2 'two-byte scan codes
  108.       SELECT CASE ASC(RIGHT$(UserKey$, 1))
  109.         CASE ScanKeyhome
  110.           XCoord = Xwindow: YCoord = Ywindow
  111.         CASE ScanKeyend
  112.           XCoord = Xwindow + Lines - 1
  113.           YCoord = Ywindow + Columns - 1
  114.         CASE ScanKeyup
  115.           IF XCoord > Xwindow THEN
  116.             XCoord = XCoord - 1
  117.           END IF
  118.         CASE ScanKeyleft
  119.           IF YCoord > Ywindow THEN
  120.             YCoord = YCoord - 1
  121.           END IF
  122.         CASE ScanKeyright
  123.           IF YCoord < Ywindow + Columns - 1 THEN
  124.             YCoord = YCoord + 1
  125.           END IF
  126.         CASE ScanKeydown
  127.           IF XCoord < Xwindow + Lines - 1 THEN
  128.             XCoord = XCoord + 1
  129.           END IF
  130.         CASE ScanKeyctrlleft
  131.           GOSUB LeftWord
  132.         CASE ScanKeyctrlright
  133.           GOSUB RightWord
  134.         CASE ScanKeyinsert
  135.           inserton = NOT inserton
  136.           LOCATE 25, 50, 0
  137.           IF inserton THEN
  138.             PRINT "Insert mode";
  139.           ELSE
  140.             PRINT SPACE$(11);
  141.           END IF
  142.         CASE ScanKeydelete
  143.           GOSUB MoveLeft
  144.         CASE ScanKeyctrlend
  145.           TextWindow = TRUE
  146.           EXIT DO
  147.         CASE ELSE
  148.           PRINT ASC(RIGHT$(UserKey$, 1))
  149.       END SELECT
  150.       LOCATE XCoord, YCoord, 1
  151.     CASE 1 'single-character scan codes
  152.       SELECT CASE ASC(UserKey$)
  153.         CASE ScanKeyenter
  154.           IF XCoord < Lines + Xwindow - 1 THEN
  155.             XCoord = XCoord + 1
  156.           END IF
  157.           YCoord = Ywindow
  158.           LOCATE XCoord, YCoord, 1
  159.         CASE ScanKeyescape
  160.           TextWindow = FALSE
  161.           EXIT DO
  162.         CASE ScanKeybackspace
  163.           IF YCoord > Ywindow THEN
  164.             YCoord = YCoord - 1
  165.             GOSUB MoveLeft
  166.           END IF
  167.           LOCATE XCoord, YCoord, 1
  168.         CASE ELSE
  169.           IF inserton THEN
  170.             GOSUB MoveRight
  171.           END IF
  172.           GOSUB UpdateBuffer
  173.           LOCATE XCoord, YCoord, 1
  174.           PRINT UserKey$;
  175.           IF YCoord < Columns + Ywindow - 1 THEN
  176.             YCoord = YCoord + 1
  177.           END IF
  178.       END SELECT
  179.     END SELECT
  180. LOOP
  181. 'End of main user input loop
  182.  
  183. 'restore cursor position
  184. LOCATE SaveX, SaveY, 1
  185. EXIT FUNCTION
  186.  
  187. UpdateBuffer:
  188. ' put the character typed into the string buffer
  189.    GOSUB ComputeBufPosn
  190.    MID$(Buffer$, BufPosn, 1) = UserKey$
  191. RETURN
  192.  
  193. MoveLeft:
  194. ' move characters left on delete or backspace
  195.    SaveYCoord = YCoord
  196.    FOR YCoord = SaveYCoord + 1 TO Ywindow + Columns - 1 STEP 1
  197.       GOSUB ComputeBufPosn
  198.       OldChar$ = MID$(Buffer$, BufPosn, 1)
  199.       LOCATE XCoord, YCoord - 1, 0
  200.       PRINT OldChar$;
  201.       MID$(Buffer$, BufPosn - 1, 1) = OldChar$
  202.    NEXT YCoord
  203.    MID$(Buffer$, BufPosn, 1) = " "
  204.    LOCATE XCoord, YCoord - 1, 1
  205.    PRINT " "
  206.    YCoord = SaveYCoord
  207.    GOSUB ComputeBufPosn
  208. RETURN
  209.  
  210. MoveRight:
  211. ' move characters right on insert
  212.    SaveYCoord = YCoord
  213.    FOR YCoord = Ywindow + Columns - 2 TO YCoord STEP -1
  214.       GOSUB ComputeBufPosn
  215.       OldChar$ = MID$(Buffer$, BufPosn, 1)
  216.       LOCATE XCoord, YCoord + 1, 0
  217.       PRINT OldChar$;
  218.       MID$(Buffer$, BufPosn + 1, 1) = OldChar$
  219.    NEXT YCoord
  220.    YCoord = SaveYCoord
  221.    GOSUB ComputeBufPosn
  222.    MID$(Buffer$, BufPosn, 1) = " "
  223.    LOCATE XCoord, YCoord, 1
  224.    PRINT " ";
  225. RETURN
  226.  
  227. LeftWord:
  228. 'Find the next word to the left
  229.    GOSUB ComputeBufPosn
  230.    IF BufPosn > 1 THEN BufPosn = BufPosn - 1
  231.    CharsSeen = FALSE
  232.    WordFound = FALSE
  233.    DO
  234.       ThisChar$ = MID$(Buffer$, BufPosn, 1)
  235.       CharsSeen = CharsSeen OR (ThisChar$ <> " ")
  236.       IF CharsSeen AND (ThisChar$ = " ") THEN
  237.          WordFound = TRUE
  238.       ELSE
  239.          BufPosn = BufPosn - 1
  240.       END IF
  241.    LOOP UNTIL WordFound OR BufPosn = 0
  242.    GOSUB ComputeCoords
  243.    LOCATE XCoord, YCoord, 1
  244. RETURN
  245.  
  246. RightWord:
  247. 'Find the next word to the right
  248.    GOSUB ComputeBufPosn
  249.    SpacesSeen = FALSE
  250.    WordFound = FALSE
  251.    DO
  252.       ThisChar$ = MID$(Buffer$, BufPosn, 1)
  253.       SpacesSeen = SpacesSeen OR (ThisChar$ = " ")
  254.       IF SpacesSeen AND (ThisChar$ <> " ") THEN
  255.          WordFound = TRUE
  256.       ELSE
  257.          IF BufPosn < Lines * Columns THEN BufPosn = BufPosn + 1
  258.       END IF
  259.    LOOP UNTIL WordFound OR BufPosn = Lines * Columns
  260.    BufPosn = BufPosn - 1
  261.    GOSUB ComputeCoords
  262.    LOCATE XCoord, YCoord, 1
  263. RETURN
  264.  
  265. ComputeBufPosn:
  266. ' Compute current position within buffer
  267.    BufPosn = ((XCoord - Xwindow) * Columns) + YCoord - Ywindow + 1
  268. RETURN
  269.  
  270. ComputeCoords:
  271. 'Compute screen Coordinates of relative BufPosn
  272.    XCoord = Xwindow + INT(BufPosn / Columns)
  273.    YCoord = Ywindow + (BufPosn MOD Columns)
  274. RETURN
  275.  
  276. END FUNCTION
  277.  
  278.